Next:
Traditional Visitor Pattern
, Previous:
std::variant & std::visit
, Up:
Index
Non-Circulating Visitors
방문자 디자인 패턴은 크게 두가지 유형으로 구분된다.
- 순환 방문자:
함수 오버로딩에 기반하는 방문자, 클래스 계층과 방문자간에 상호 참조하는 순환적인 종속성이 발생
- 비순환 방문자:
런타임 타입 정보(RTTI)에 의존하는 방문자, 방문될 클래스 계층에 제한이 없다. 성능에서는 약간의 손해
비순환 방문자 패턴에서 방문자의 인터페이스 정의
template
<
typename
Visitable
>
struct
Visitor
{
virtual
void
visit
(
Visitable
&
obj
)
=
0
;
}
;
struct
VisitorBase
{
//
마
커
인
터
페
이
스
virtual
~
VisitorBase
(
)
=
default
;
}
;
//
버
추
얼
속
성
을
위
해
,
버
추
얼
소
멸
자
를
가
진
공
백
클
래
스
struct
Expression
{
virtual
~
Expression
(
)
=
default
;
virtual
void
accept
(
VisitorBase
&
obj
)
{
using
EV
=
Visitor
<
Expression
>
;
if
(
auto
ev
=dynamic_cast<
EV
*>
(
&
obj
))
ev
->
visit
(
*
this
)
;
}
}
;
struct
ExpressionPrinter
:
VisitorBase
,
Visitor
<
DoubleExpression
>
,
Visitor
<
AdditionExpression
>
{
void
visit
(
DoubleExpression
&
obj
)
override
;
void
visit
(
AdditionExpression
&
obj
)
override
;
string
str
(
)
const
{
return
oss
.
str
(
)
;
}
private
:
ostringstream
oss
;
}
;